//专门处理操作数据：`addTodo`，`removeTodo`,`toggleComplete`
//以便于数据的专门维护
import { ITodoData } from '../typings.ts';
import TodoDom from './TodoDom';
import { getTodoList, removeTodo, toggleTodo, addTodo } from './TodoService';

class TodoEvent extends TodoDom {
  private _todoData: ITodoData[];

  constructor(todoData: ITodoData[], todoWrapper: HTMLElement) {
    super(todoWrapper);
    this._todoData = todoData;
    this._init(this._todoData);
  }

  //新增装饰器去请求数据
  @getTodoList
  private _init(todoData: ITodoData[]) {
    this._todoData = todoData;

    //调用父类的方法 加载默认的静态数据
    this.initList(this._todoData);
  }

  //提供外界操作的方法
  //新增一项
  @addTodo
  public addTodo(todo: ITodoData): undefined | number {
    //数据去重操作
    //find()返回通过测试的数组的第一个元素的值
    const _todo: null | ITodoData = this._todoData.find(
      (item: ITodoData) => item.content === todo.content
    );

    //值不存在时
    if (!_todo) {
      //将外界传入的todo项添加进数组
      this._todoData.push(todo);

      //调用父类的实例方法 去新增一项dom节点
      this.addItem(todo);

      //直接return 报undefined
      return;
    }

    //万一有值时(重复的内容) 报错误码 number
    return 1001;
  }

  //删除某一项
  @removeTodo
  public removeTodo(target: HTMLElement, id: number): void {
    //过滤不符合的一项 保留其余项
    this._todoData = this._todoData.filter((todo: ITodoData) => todo.id !== id);

    //调用父类的方法 移除某一项节点
    this.removeItem(target);
  }

  //切换状态
  @toggleTodo
  public toggleComplete(target: HTMLElement, id: number): void {
    this._todoData = this._todoData.map((todo: ITodoData) => {
      if (todo.id === id) {
        todo.completed = !todo.completed;

        //调用父类的方法 修改某一项的节点样式属性
        this.changeCompleted(target, todo.completed);
      }
      return todo;
    });
  }
}

export default TodoEvent;
